package statemodel.entity;

import lombok.Data;

/**
 * 糖果机  (状态机)
 * 四个状态
 * @author yaojianfeng
 */
@Data
public class GumballMachine {
    /**
     * 这就是那四个状态
     * 它们符合万能糖果公司的状态图
     */
    private  int SOLD_OUT = 0;
    private  int NO_QUARTER = 1;
    private  int HAS_QUARTER = 2;
    private  int SOLD = 3;
    /**
     * 这个实例变量跟踪当前状态,一开始被设置为"糖果售罄"
     */
    int state = SOLD_OUT;
    /**
     * 这个实例变量 用来追踪机器内的糖果数目
     */
    int count = 0;

    /**
     * 构造器需要初始化糖果库存量当做参数
     * 如果库存不为0 机器就会进入"没有25分钱"的状态 ,也就是说它等着别人投入25分钱
     * 如果糖果数目为0的话,机器就会保持在"糖果售罄"的状态
     * @param count 糖果数目
     */
    public GumballMachine(int count) {
        this.count = count;
        if (count>0){
            state = NO_QUARTER;
        }
    }

    /**
     * 实现投掷25分硬币的方法 以及其状态转换
     */
    public void insertQuarter(){
        if (state == HAS_QUARTER){
            System.out.println("硬币已投掷! 糖果没有出货之前无法投掷下一枚硬币!");
        }else if (state == NO_QUARTER){
            state = HAS_QUARTER;
            System.out.println("您已投币!");
        }else if (state == SOLD_OUT){
            System.out.println("无法投币! 糖果机已售罄!");
        }else if (state == SOLD){
            System.out.println("请稍后,糖果正在出货中!");
        }
    }

    //todo 其他的状态行为  但是这样的代码不容易维护和扩展



}
